﻿#pragma once
#include <exception>
#include <iostream>
#include <QDateTime>

//get和set函数，还有信号
#define PROPERTYFUNC_SIGNAL_(_name_,type,initValue)\
public:\
    void set_##_name_(type value){\
        if(value != this->_name_) {\
            this->_name_ = value; \
            emit _name_##_Notify();\
        }\
    }\
    type get_##_name_()const{return this->_name_;}\
Q_SIGNALS:\
    void _name_##_Notify();

/**
 * @brief 注册普通变量，可以通过set设置变换值，通过get获取变量值，set值以后会发信号
 * @name        变量名
 * @type        变量类型
 * @initValue   初始化值
 * @note 这个注册的是有变量的QML属性(相当于有注册了一个成员变量给)
*/
#define NORMAL_DATA(_name_,type,initValue)\
PROPERTYFUNC_SIGNAL_(_name_,type,initValue)\
public:\
    type _name_ = initValue;



/**
 * @brief       注册属性到QML里去 不会写入文件
 * @_name_      变量名
 * @type        变量类型
 * @initValue   初始化值
 */
#define QML_PROPERTY_(_name_,type,initValue)\
private:\
    Q_PROPERTY(type _name_ READ get_##_name_ WRITE set_##_name_ NOTIFY _name_##_Notify) \
public:\
    void set_##_name_(type value){\
        if(value != _name_) {\
            _name_ = value; \
            emit _name_##_Notify();\
        }\
    }\
    type get_##_name_()const{return this->_name_;}\
Q_SIGNALS:\
    void _name_##_Notify();\
public:\
    type _name_ = initValue;



/**
  *@brief 在QML中要访问类成员必须要获取变量的指针才可以
  *
  */
#define QML_PROPERTY_CLASS(_name_,type)\
private:\
    Q_PROPERTY(type* _name_ READ get_##_name_ NOTIFY _name_##_Notify)\
Q_SIGNALS:\
    void _name_##_Notify();\
public:\
    /**和其他无异还是普通数据*/\
    type _name_;\
    type* get_##_name_(){return &_name_;}

#define TestLog(msg)\
{\
    QString text = QString("File：%1  Line：%2  Data：%3  Info：%4 \r\n")\
    .arg (__FILE__).arg (__LINE__).arg (QDateTime::currentDateTime ().toString ("yyyy-MM-dd hh:mm:ss ddd")).arg (msg);\
    std::cout << text.toStdString() << std::endl;\
}
